package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/form-smallest-number-from-two-digit-arrays/'>从两个数字数组里生成最小数字(Form Smallest Number From Two Digit Arrays)</a>
 * <p>给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ，每个数组中的元素 互不相同 ，请你返回 最小 的数字，两个数组都 至少 包含这个数字的某个数位。 </p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 * 示例 1：
 *      输入：nums1 = [4,1,3], nums2 = [5,7]
 *      输出：15
 *      解释：数字 15 的数位 1 在 nums1 中出现，数位 5 在 nums2 中出现。15 是我们能得到的最小数字。
 *
 * 示例 2：
 *      输入：nums1 = [3,5,2,6], nums2 = [3,1,7]
 *      输出：3
 *      解释：数字 3 的数位 3 在两个数组中都出现了。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>1 <= nums1.length, nums2.length <= 9</li>
 *      <li>1 <= nums1[i], nums2[i] <= 9</li>
 *      <li>每个数组中，元素 互不相同 。</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/23 14:21
 */
public class LC2605FormSmallestNumberFromTwoDigitArrays_S {

    static class Solution {

        public int minNumber(int[] nums1, int[] nums2) {
            // 统计 nums1 中出现的最小数字 和 出现过哪些数字
            int mask = 0;
            int nums1MinValue = 10;
            for (int num : nums1) {
                nums1MinValue = Math.min(nums1MinValue, num);
                mask |= (1 << num);
            }
            int nums2MinValue = 10;
            int nums2MinValueE = 10;
            for (int num : nums2) {
                if ((mask & (1 << num)) != 0) {
                    nums2MinValueE = Math.min(nums2MinValueE, num);
                } else {
                    nums2MinValue = Math.min(nums2MinValue, num);
                }
            }
            if (nums2MinValueE != 10) {
                return nums2MinValueE;
            }
            return nums1MinValue <= nums2MinValue ? nums1MinValue * 10 + nums2MinValue : nums1MinValue + nums2MinValue * 10;
        }

        public int minNumber2(int[] nums1, int[] nums2) {
            // 统计 nums1 中出现的最小数字 和 出现过哪些数字
            int mask1 = 0;
            int mask2 = 0;
            for (int num : nums1) {
                mask1 |= (1 << num);
            }
            for (int num : nums2) {
                mask2 |= (1 << num);
            }
            int mask = mask1 & mask2;
            if (mask != 0) {
                return Integer.numberOfTrailingZeros(mask);
            }
            int a = Integer.numberOfTrailingZeros(mask1);
            int b = Integer.numberOfTrailingZeros(mask2);
            return Math.min(a * 10 + b, b * 10 + a);

        }


    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.minNumber(new int[]{1, 4, 3}, new int[]{5, 7}));
        System.out.println(solution.minNumber(new int[]{3, 5, 2, 6}, new int[]{3, 1, 7}));
    }
}
